package com.qing.apple.filter.demo02.service;

import com.qing.apple.filter.bean.Apple;
import com.qing.apple.filter.demo02.formatter.AppleFormatter;
import com.qing.apple.filter.demo02.predicate.ApplePredicate;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class AppleService {

	/**
	 * 筛选苹果
	 * @param apples
	 * @return
	 */
	public static List<Apple> filterApples(List<Apple> apples, ApplePredicate p){
		List<Apple> result=new ArrayList<>();
		for (Apple apple : apples) {
			if(p.test(apple)){  //p谓词 封装测试苹果的条件
				result.add(apple);
			}
		}
		return  result;
	}

	/**
	 * 打印苹果信息
	 * @param apples
	 * @param formatter
	 */
	public  static  void prettyPrintApple(List<Apple> apples, AppleFormatter formatter){
		for (Apple apple : apples) {
			String output=formatter.accept(apple);
			System.out.println(output);
		}
	}

	/**
	 * 将List类型抽象化
	 * 现在你可以把filter方法用在香蕉、橘子、Integer或是String的列表上了
	 * @param list
	 * @param p  断定型接口
	 * @param <T>
	 * @return
	 */
	public static  <T> List<T> filter(List<T> list, Predicate<T> p){
		List<T> result=new ArrayList<>();
		for (T t : list) {
			if(p.test(t)){  //p谓词 封装测试苹果的条件
				result.add(t);
			}
		}
		return  result;
	};
}
